home *** CD-ROM | disk | FTP | other *** search
/ The Atari Compendium / The Atari Compendium (Toad Computers) (1994).iso / files / prgtools / gnustuff / tos / progut~1 / gperf.zoo / gperf-info < prev    next >
Encoding:
Text File  |  1990-05-05  |  49.8 KB  |  1,086 lines

  1. Info file: gperf-info,    -*-Text-*-
  2. produced by texinfo-format-buffer
  3. from file: gperf.texinfo
  4.  
  5.  
  6. This file documents the features of the GNU Perfect Hash Function Generator
  7.  
  8. Copyright (C) 1989 Free Software Foundation, Inc.
  9.  
  10. Permission is granted to make and distribute verbatim copies of
  11. this manual provided the copyright notice and this permission notice
  12. are preserved on all copies.
  13.  
  14.  
  15. Permission is granted to copy and distribute modified versions of this
  16. manual under the conditions for verbatim copying, provided also that the
  17. section entitled "GNU General Public License" is included exactly as
  18. in the original, and provided that the entire resulting derived work is
  19. distributed under the terms of a permission notice identical to this one.
  20.  
  21. Permission is granted to copy and distribute translations of this manual
  22. into another language, under the above conditions for modified versions,
  23. except that the section entitled "GNU `gperf' General Public License" an
  24. d
  25. this permission notice may be included in translations approved by the
  26. Free Software Foundation instead of in the original English.
  27.  
  28.  
  29.  
  30. File: gperf-info  Node: Top, Up: (DIR), Next: Copying
  31.  
  32. Introduction
  33. ************
  34.  
  35. This manual documents the GNU `gperf' perfect hash function generator
  36. utility, focusing on its features and how to use them, and how to report
  37. bugs.
  38.  
  39. * Menu:
  40.  
  41. * Copying::         GNU `gperf' General Public License says
  42.                     how you can copy and share `gperf'.
  43. * Contributors::    People who have contributed to `gperf'.
  44. * Motivation::      Static search structures and GNU GPERF.
  45. * Description::     High-level discussion of how GPERF functions.
  46. * Options::         A description of options to the program.
  47. * Bugs::            Known bugs and limitations with GPERF.
  48. * Projects::        Things still left to do.
  49. * Implementation::  Implementation Details for GNU GPERF.
  50. * Bibliography::    Material Referenced in this Report.
  51.  
  52. File: gperf-info  Node: Copying, Prev: Top, Up: Top, Next: Contributors
  53.  
  54. GNU GENERAL PUBLIC LICENSE
  55. **************************
  56.                         Version 1, February 1989
  57.  
  58.      Copyright (C) 1989 Free Software Foundation, Inc.
  59.      675 Mass Ave, Cambridge, MA 02139, USA
  60.  
  61.      Everyone is permitted to copy and distribute verbatim copies
  62.      of this license document, but changing it is not allowed.
  63.  
  64.  
  65. Preamble
  66. ========
  67.  
  68.   The license agreements of most software companies try to keep users
  69. at the mercy of those companies.  By contrast, our General Public
  70. License is intended to guarantee your freedom to share and change free
  71. software---to make sure the software is free for all its users.  The
  72. General Public License applies to the Free Software Foundation's
  73. software and to any other program whose authors commit to using it.
  74. You can use it for your programs, too.
  75.  
  76.   When we speak of free software, we are referring to freedom, not
  77. price.  Specifically, the General Public License is designed to make
  78. sure that you have the freedom to give away or sell copies of free
  79. software, that you receive source code or can get it if you want it,
  80. that you can change the software or use pieces of it in new free
  81. programs; and that you know you can do these things.
  82.  
  83.   To protect your rights, we need to make restrictions that forbid
  84. anyone to deny you these rights or to ask you to surrender the rights.
  85. These restrictions translate to certain responsibilities for you if you
  86. distribute copies of the software, or if you modify it.
  87.  
  88.   For example, if you distribute copies of a such a program, whether
  89. gratis or for a fee, you must give the recipients all the rights that
  90. you have.  You must make sure that they, too, receive or can get the
  91. source code.  And you must tell them their rights.
  92.  
  93.   We protect your rights with two steps: (1) copyright the software, and
  94. (2) offer you this license which gives you legal permission to copy,
  95. distribute and/or modify the software.
  96.  
  97.   Also, for each author's protection and ours, we want to make certain
  98. that everyone understands that there is no warranty for this free
  99. software.  If the software is modified by someone else and passed on, we
  100. want its recipients to know that what they have is not the original, so
  101. that any problems introduced by others will not reflect on the original
  102. authors' reputations.
  103.  
  104.   The precise terms and conditions for copying, distribution and
  105. modification follow.
  106.  
  107.                           TERMS AND CONDITIONS
  108.  
  109.   1. This License Agreement applies to any program or other work which
  110.      contains a notice placed by the copyright holder saying it may be
  111.      distributed under the terms of this General Public License.  The
  112.      "Program", below, refers to any such program or work, and a "work based
  113.      on the Program" means either the Program or any work containing the
  114.      Program or a portion of it, either verbatim or with modifications.  Each
  115.      licensee is addressed as "you".
  116.  
  117.   2. You may copy and distribute verbatim copies of the Program's source
  118.      code as you receive it, in any medium, provided that you conspicuously and
  119.      appropriately publish on each copy an appropriate copyright notice and
  120.      disclaimer of warranty; keep intact all the notices that refer to this
  121.      General Public License and to the absence of any warranty; and give any
  122.      other recipients of the Program a copy of this General Public License
  123.      along with the Program.  You may charge a fee for the physical act of
  124.      transferring a copy.
  125.  
  126.   3. You may modify your copy or copies of the Program or any portion of
  127.      it, and copy and distribute such modifications under the terms of Paragraph
  128.      1 above, provided that you also do the following:
  129.  
  130.         * cause the modified files to carry prominent notices stating that
  131.           you changed the files and the date of any change; and
  132.  
  133.         * cause the whole of any work that you distribute or publish, that
  134.           in whole or in part contains the Program or any part thereof, either
  135.           with or without modifications, to be licensed at no charge to all
  136.           third parties under the terms of this General Public License (except
  137.           that you may choose to grant warranty protection to some or all
  138.           third parties, at your option).
  139.  
  140.         * If the modified program normally reads commands interactively when
  141.           run, you must cause it, when started running for such interactive use
  142.           in the simplest and most usual way, to print or display an
  143.           announcement including an appropriate copyright notice and a notice
  144.           that there is no warranty (or else, saying that you provide a
  145.           warranty) and that users may redistribute the program under these
  146.           conditions, and telling the user how to view a copy of this General
  147.           Public License.
  148.  
  149.         * You may charge a fee for the physical act of transferring a
  150.           copy, and you may at your option offer warranty protection in
  151.           exchange for a fee.
  152.  
  153.      Mere aggregation of another independent work with the Program (or its
  154.      derivative) on a volume of a storage or distribution medium does not bring
  155.      the other work under the scope of these terms.
  156.  
  157.   4. You may copy and distribute the Program (or a portion or derivative of
  158.      it, under Paragraph 2) in object code or executable form under the terms of
  159.      Paragraphs 1 and 2 above provided that you also do one of the following:
  160.  
  161.         * accompany it with the complete corresponding machine-readable
  162.           source code, which must be distributed under the terms of
  163.           Paragraphs 1 and 2 above; or,
  164.  
  165.         * accompany it with a written offer, valid for at least three
  166.           years, to give any third party free (except for a nominal charge
  167.           for the cost of distribution) a complete machine-readable copy of the
  168.           corresponding source code, to be distributed under the terms of
  169.           Paragraphs 1 and 2 above; or,
  170.  
  171.         * accompany it with the information you received as to where the
  172.           corresponding source code may be obtained.  (This alternative is
  173.           allowed only for noncommercial distribution and only if you
  174.           received the program in object code or executable form alone.)
  175.  
  176.      Source code for a work means the preferred form of the work for making
  177.      modifications to it.  For an executable file, complete source code means
  178.      all the source code for all modules it contains; but, as a special
  179.      exception, it need not include source code for modules which are standard
  180.      libraries that accompany the operating system on which the executable
  181.      file runs, or for standard header files or definitions files that
  182.      accompany that operating system.
  183.  
  184.   5. You may not copy, modify, sublicense, distribute or transfer the
  185.      Program except as expressly provided under this General Public License.
  186.      Any attempt otherwise to copy, modify, sublicense, distribute or transfer
  187.      the Program is void, and will automatically terminate your rights to use
  188.      the Program under this License.  However, parties who have received
  189.      copies, or rights to use copies, from you under this General Public
  190.      License will not have their licenses terminated so long as such parties
  191.      remain in full compliance.
  192.  
  193.   6. By copying, distributing or modifying the Program (or any work based
  194.      on the Program) you indicate your acceptance of this license to do so,
  195.      and all its terms and conditions.
  196.  
  197.   7. Each time you redistribute the Program (or any work based on the
  198.      Program), the recipient automatically receives a license from the original
  199.      licensor to copy, distribute or modify the Program subject to these
  200.      terms and conditions.  You may not impose any further restrictions on the
  201.      recipients' exercise of the rights granted herein.
  202.  
  203.   8. The Free Software Foundation may publish revised and/or new versions
  204.      of the General Public License from time to time.  Such new versions will
  205.      be similar in spirit to the present version, but may differ in detail to
  206.      address new problems or concerns.
  207.  
  208.      Each version is given a distinguishing version number.  If the Program
  209.      specifies a version number of the license which applies to it and "any
  210.      later version", you have the option of following the terms and conditions
  211.      either of that version or of any later version published by the Free
  212.      Software Foundation.  If the Program does not specify a version number of
  213.      the license, you may choose any version ever published by the Free Software
  214.      Foundation.
  215.  
  216.   9. If you wish to incorporate parts of the Program into other free
  217.      programs whose distribution conditions are different, write to the author
  218.      to ask for permission.  For software which is copyrighted by the Free
  219.      Software Foundation, write to the Free Software Foundation; we sometimes
  220.      make exceptions for this.  Our decision will be guided by the two goals
  221.      of preserving the free status of all derivatives of our free software and
  222.      of promoting the sharing and reuse of software generally.
  223.  
  224.                                  NO WARRANTY
  225.  
  226.  10. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
  227.      FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
  228.      OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
  229.      PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
  230.      OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
  231.      MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
  232.      TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
  233.      PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
  234.      REPAIR OR CORRECTION.
  235.  
  236.  11. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL
  237.      ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
  238.      REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
  239.      INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES
  240.      ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT
  241.      LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES
  242.      SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE
  243.      WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN
  244.      ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
  245.  
  246.                       END OF TERMS AND CONDITIONS
  247.  
  248.  
  249. Appendix: How to Apply These Terms to Your New Programs
  250. =======================================================
  251.  
  252.   If you develop a new program, and you want it to be of the greatest
  253. possible use to humanity, the best way to achieve this is to make it
  254. free software which everyone can redistribute and change under these
  255. terms.
  256.  
  257.   To do so, attach the following notices to the program.  It is safest to
  258. attach them to the start of each source file to most effectively convey
  259. the exclusion of warranty; and each file should have at least the
  260. "copyright" line and a pointer to where the full notice is found.
  261.  
  262.      ONE LINE TO GIVE THE PROGRAM'S NAME AND A BRIEF IDEA OF WHAT IT DOES.
  263.      Copyright (C) 19YY  NAME OF AUTHOR
  264.  
  265.      This program is free software; you can redistribute it and/or modify
  266.      it under the terms of the GNU General Public License as published by
  267.      the Free Software Foundation; either version 1, or (at your option)
  268.      any later version.
  269.  
  270.      This program is distributed in the hope that it will be useful,
  271.      but WITHOUT ANY WARRANTY; without even the implied warranty of
  272.      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  273.      GNU General Public License for more details.
  274.  
  275.      You should have received a copy of the GNU General Public License
  276.      along with this program; if not, write to the Free Software
  277.      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  278.  
  279. Also add information on how to contact you by electronic and paper mail.
  280.  
  281. If the program is interactive, make it output a short notice like this
  282. when it starts in an interactive mode:
  283.  
  284.      Gnomovision version 69, Copyright (C) 19YY NAME OF AUTHOR
  285.      Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
  286.      This is free software, and you are welcome to redistribute it
  287.      under certain conditions; type `show c' for details.
  288.  
  289. The hypothetical commands `show w' and `show c' should show the
  290. appropriate parts of the General Public License.  Of course, the
  291. commands you use may be called something other than `show w' and `show
  292. c'; they could even be mouse-clicks or menu items---whatever suits your
  293. program.
  294.  
  295. You should also get your employer (if you work as a programmer) or your
  296. school, if any, to sign a "copyright disclaimer" for the program, if
  297. necessary.  Here a sample; alter the names:
  298.  
  299.      Yoyodyne, Inc., hereby disclaims all copyright interest in the
  300.      program `Gnomovision' (a program to direct compilers to make passes
  301.      at assemblers) written by James Hacker.
  302.  
  303.      SIGNATURE OF TY COON, 1 April 1989
  304.      Ty Coon, President of Vice
  305.  
  306. That's all there is to it!
  307.  
  308. File: gperf-info  Node: Contributors, Prev: Copying, Up: Top, Next: Motivation
  309.  
  310. Contributors to GNU `gperf' Utility
  311. ***********************************
  312.  
  313.    * The GNU `gperf' perfect hash function generator utility was
  314.      originally written in GNU C++ by Douglas C. Schmidt.  It is now also
  315.      available in a highly-portable "old-style" C version.  The general
  316.      idea for the perfect hash function generator was inspired by Keith
  317.      Bostic's algorithm written in C, and distributed to net.sources around
  318.      1984.  The current program is a heavily modified, enhanced, and extended
  319.      implementation of Keith's basic idea, created at the University of
  320.      California, Irvine.  Bugs, patches, and suggestions should be reported
  321.      to schmidt at ics.uci.edu.
  322.  
  323.    * Special thanks is extended to Michael Tiemann and Doug Lea, for
  324.      providing a useful compiler, and for giving me a forum to exhibit my
  325.      creation.
  326.  
  327.      In addition, Adam de Boor and Nels Olson provided many tips and insights
  328.      that greatly helped improve the quality and functionality of `gperf'.
  329.  
  330. File: gperf-info  Node: Motivation, Prev: Contributors, Up: Top, Next: Search Structures
  331.  
  332. Introduction
  333. ************
  334.  
  335. `gperf' is a perfect hash function generator written in C++.  It
  336. transforms an *n* element user-specified keyword set *W* into
  337. a perfect hash function *F*.  *F* uniquely maps keywords in
  338. *W* onto the range 0..*k*, where *k* >= *n*.  If
  339. *k = n* then *F* is a *minimal* perfect hash function.
  340. `gperf' generates a 0..*k* element static lookup table and a
  341. pair of C functions.  These functions determine whether a given
  342. character string *s* occurs in *W*, using at most one probe
  343. into the lookup table.
  344.  
  345. `gperf' currently generates the reserved keyword recognizer for
  346. lexical analyzers in several production and research compilers and
  347. language processing tools, including GNU C, GNU C++, GNU Pascal, GNU
  348. Modula 3, and GNU indent.  Complete C++ source code for `gperf' is
  349. available via anonymous ftp from ics.uci.edu.  `gperf' also is
  350. distributed along with the GNU libg++ library.  A highly portable,
  351. functionally equivalent K&R C version of `gperf' is archived in
  352. comp.sources.unix, volume 20.  Finally, a paper describing
  353. `gperf''s design and implementation in greater detail is available
  354. in the Second USENIX C++ Conference proceedings.
  355.  
  356. File: gperf-info  Node: Search Structures, Prev: Motivation, Up: Top, Next: Description
  357.  
  358. Static search structures and GNU `gperf'
  359. ****************************************
  360.  
  361. A "static search structure" is an Abstract Data Type with certain
  362. fundamental operations, *e.g.*, *initialize*, *insert*,
  363. and *retrieve*.  Conceptually, all insertions occur before any
  364. retrievals.  In practice, `gperf' generates a `static' array
  365. containing search set keywords and any associated attributes specified
  366. by the user.  Thus, there is essentially no execution-time cost for the
  367. insertions.  It is a useful data structure for representing *static
  368. search sets*.  Static search sets occur frequently in software system
  369. applications.  Typical static search sets include compiler reserved
  370. words, assembler instruction opcodes, and built-in shell interpreter
  371. commands.  Search set members, called "keywords", are inserted into
  372. the structure only once, usually during program initialization, and are
  373. not generally modified at run-time.
  374.  
  375. Numerous static search structure implementations exist, *e.g.*,
  376. arrays, linked lists, binary search trees, digital search tries, and
  377. hash tables.  Different approaches offer trade-offs between space
  378. utilization and search time efficiency.  For example, an *n* element
  379. sorted array is space efficient, though the average-case time
  380. complexity for retrieval operations using binary search is
  381. proportional to log *n*.  Conversely, hash table implementations
  382. often locate a table entry in constant time, but typically impose
  383. additional memory overhead and exhibit poor worst case performance.
  384.  
  385.  
  386. *Minimal perfect hash functions* provide an optimal solution for a
  387. particular class of static search sets.  A minimal perfect hash
  388. function is defined by two properties:
  389.  
  390.    * It allows keyword recognition in a static search set using at most
  391.      *one* probe into the hash table.  This represents the "perfect"
  392.      property.
  393.    * The actual memory allocated to store the keywords is precisely large
  394.      enough for the keyword set, and *no larger*.  This is the
  395.      "minimal" property.
  396.  
  397. For most applications it is far easier to generate *perfect* hash
  398. functions than *minimal perfect* hash functions.  Moreover,
  399. non-minimal perfect hash functions frequently execute faster than
  400. minimal ones in practice.  This phenomena occurs since searching a
  401. sparse keyword table increases the probability of locating a "null"
  402. entry, thereby reducing string comparisons.  `gperf''s default
  403. behavior generates *near-minimal* perfect hash functions for
  404. keyword sets.  However, `gperf' provides many options that permit
  405. user control over the degree of minimality and perfection.
  406.  
  407. Static search sets often exhibit relative stability over time.  For
  408. example, Ada's 63 reserved words have remained constant for nearly a
  409. decade.  It is therefore frequently worthwhile to expend concerted
  410. effort building an optimal search structure *once*, if it
  411. subsequently receives heavy use multiple times.  `gperf' removes
  412. the drudgery associated with constructing time- and space-efficient
  413. search structures by hand.  It has proven a useful and practical tool
  414. for serious programming projects.  Output from `gperf' is currently
  415. used in several production and research compilers, including GNU C, GNU
  416. C++, GNU Pascal, and GNU Modula 3.  The latter two compilers are not yet
  417. part of the official GNU distr ibution.  Each compiler utilizes
  418. `gperf' to automatically generate static search structures that
  419. efficiently identify their respective reserved keywords.
  420.  
  421. File: gperf-info  Node: Description, Prev: Motivation, Up: Top, Next: Options
  422.  
  423. High-Level Description of GNU `gperf'
  424. *************************************
  425.  
  426. * Menu:
  427.  
  428. * Input Format:: Input Format to `gperf'
  429. * Output Format:: Output Format for Generated C Code with `gperf'
  430.  
  431. The perfect hash function generator `gperf' reads a set of
  432. "keywords" from a "keyfile" (or from the standard input by
  433. default).  It attempts to derive a perfect hashing function that
  434. recognizes a member of the "static keyword set" with at most a
  435. single probe into the lookup table.  If `gperf' succeeds in
  436. generating such a function it produces a pair of C source code routines
  437. that perform hashing and table lookup recognition.  All generated C code
  438. is directed to the standard output.  Command-line options described
  439. below allow you to modify the input and output format to `gperf'.
  440.  
  441. By default, `gperf' attempts to produce time-efficient code, with
  442. less emphasis on efficient space utilization.  However, several options
  443. exist that permit trading-off execution time for storage space and vice
  444. versa.  In particular, expanding the generated table size produces a
  445. sparse search structure, generally yielding faster searches.
  446. Conversely, you can direct `gperf' to utilize a C `switch'
  447. statement scheme that minimizes data space storage size.  Furthermore,
  448. using a C `switch' may actually speed up the keyword retrieval time
  449. somewhat.  Actual results depend on your C compiler, of course.
  450.  
  451. In general, `gperf' assigns values to the characters it is using
  452. for hashing until some set of values gives each keyword a unique value.
  453. A helpful heuristic is that the larger the hash value range, the easier
  454. it is for `gperf' to find and generate a perfect hash function.
  455. Experimentation is the key to getting the most from `gperf'.
  456.  
  457. File: gperf-info  Node: Input Format, Prev: Description, Up: Description, Next: Declarations
  458.  
  459. Input Format to `gperf'
  460. =======================
  461.  
  462. You can control the input keyfile format by varying certain command-line
  463. arguments, in particular the `-t' option.  The input's appearance
  464. is similar to GNU utilities `flex' and `bison' (or UNIX
  465. utilities `lex' and `yacc').  Here's an outline of the general
  466. format:
  467.  
  468.      declarations
  469.      %%
  470.      keywords
  471.      %%
  472.      functions
  473.  
  474. *Unlike* `flex' or `bison', all sections of `gperf''s input
  475. are optional.  The following sections describe the input format for each
  476. section.
  477.  
  478. * Menu:
  479.  
  480. * Declarations:: `struct' Declarations and C Code Inclusion.
  481. * Keywords::      Format for Keyword Entries.
  482. * Functions::     Including Additional C Functions.
  483.  
  484. File: gperf-info  Node: Declarations, Prev: Input Format, Up: Input Format, Next: Keywords
  485.  
  486. `struct' Declarations and C Code Inclusion
  487. ------------------------------------------
  488.  
  489. The keyword input file optionally contains a section for including
  490. arbitrary C declarations and definitions, as well as provisions for
  491. providing a user-supplied `struct'.  If the `-t' option
  492. *is* enabled, you *must* provide a C `struct' as the last
  493. component in the declaration section from the keyfile file.  The first
  494. field in this struct must be a `char *' identifier called "name,"
  495. although it is possible to modify this field's name with the `-K'
  496. option described below.
  497.  
  498. Here is simple example, using months of the year and their attributes as
  499. input:
  500.  
  501.      struct months { char *name; int number; int days; int leap_days; };
  502.      %%
  503.      january,   1, 31, 31
  504.      february,  2, 28, 29
  505.      march,     3, 31, 31
  506.      april,     4, 30, 30
  507.      may,       5, 31, 31
  508.      june,      6, 30, 30
  509.      july,      7, 31, 31
  510.      august,    8, 31, 31
  511.      september, 9, 30, 30
  512.      october,  10, 31, 31
  513.      november, 11, 30, 30
  514.      december, 12, 31, 31
  515.  
  516. Separating the `struct' declaration from the list of key words and
  517. other fields are a pair of consecutive percent signs, `%%',
  518. appearing left justified in the first column, as in the UNIX utility
  519. `lex'.
  520.  
  521. Using a syntax similar to GNU utilities `flex' and `bison', it
  522. is possible to directly include C source text and comments verbatim into
  523. the generated output file.  This is accomplished by enclosing the region
  524. inside left-justified surrounding `%{', `%}' pairs.  Here is
  525. an input fragment based on the previous example that illustrates this
  526. feature:
  527.  
  528.      %{
  529.      #include <assert.h>
  530.      /* This section of code is inserted directly into the output. */
  531.      int return_month_days (struct months *months, int is_leap_year);
  532.      %}
  533.      struct months { char *name; int number; int days; int leap_days; };
  534.      %%
  535.      january,   1, 31, 31
  536.      february,  2, 28, 29
  537.      march,     3, 31, 31
  538.      ...
  539.  
  540. It is possible to omit the declaration section entirely.  In this case
  541. the keyfile begins directly with the first keyword line, *e.g.*:
  542.  
  543.      january,   1, 31, 31
  544.      february,  2, 28, 29
  545.      march,     3, 31, 31
  546.      april,     4, 30, 30
  547.      ...
  548.  
  549. File: gperf-info  Node: Keywords, Prev: Declarations, Up: Input Format, Next: Functions
  550.  
  551. Format for Keyword Entries
  552. --------------------------
  553.  
  554. The second keyfile format section contains lines of keywords and any
  555. associated attributes you might supply.  A line beginning with `#'
  556. in the first column is considered a comment.  Everything following the
  557. `#' is ignored, up to and including the following newline.
  558.  
  559. The first field of each non-comment line is always the key itself.  It
  560. should be given as a simple name, *i.e.*, without surrounding
  561. string quotation marks, and be left-justified flush against the first
  562. column.  In this context, a "field" is considered to extend up to, but
  563. not include, the first blank, comma, or newline.  Here is a simple
  564. example taken from a partial list of C reserved words:
  565.  
  566.      # These are a few C reserved words, see the c.`gperf' file 
  567.      # for a complete list of ANSI C reserved words.
  568.      unsigned
  569.      sizeof
  570.      switch
  571.      signed
  572.      if
  573.      default
  574.      for
  575.      while
  576.      return
  577.  
  578. Note that unlike `flex' or `bison' the first `%%' marker
  579. may be elided if the declaration section is empty.
  580.  
  581. Additional fields may optionally follow the leading keyword.  Fields
  582. should be separated by commas, and terminate at the end of line.  What
  583. these fields mean is entirely up to you; they are used to initialize the
  584. elements of the user-defined `struct' provided by you in the
  585. declaration section.  If the `-t' option is *not* enabled
  586. these fields are simply ignored.  All previous examples except the last
  587. one contain keyword attributes.
  588.  
  589. File: gperf-info  Node: Functions, Prev: Keywords, Up: Input Format, Next: Output Format
  590.  
  591. Including Additional C Functions
  592. --------------------------------
  593.  
  594. The optional third section also corresponds closely with conventions
  595. found in `flex' and `bison'.  All text in this section,
  596. starting at the final `%%' and extending to the end of the input
  597. file, is included verbatim into the generated output file.  Naturally,
  598. it is your responsibility to ensure that the code contained in this
  599. section is valid C.
  600.  
  601. File: gperf-info  Node: Output Format, Prev: Functions, Up: Description
  602.  
  603. Output Format for Generated C Code with `gperf'
  604. ===============================================
  605.  
  606. Several options control how the generated C code appears on the standard
  607. output.  Two C function are generated.  They are called `hash' and
  608. `in_word_set', although you may modify the name for
  609. `in_word_set' with a command-line option.  Both functions require
  610. two arguments, a string, `char *' STR, and a length
  611. parameter, `int' LEN.  Their default function prototypes are
  612. as follows:
  613.  
  614.      static int hash (char *str, int len);
  615.      int in_word_set (char *str, int len);
  616.  
  617. By default, the generated `hash' function returns an integer value
  618. created by adding LEN to several user-specified STR key
  619. positions indexed into an "associated values" table stored in a
  620. local static array.  The associated values table is constructed
  621. internally by `gperf' and later output as a static local C array called
  622. HASH_TABLE; its meaning and properties are described below.
  623. *Note Implementation::. The relevant key positions are specified via the
  624. `-k' option when running `gperf', as detailed in the *Options*
  625. section below. *Note Options::.
  626.  
  627. Two options, `-g' (assume you are compiling with GNU C and its
  628. `inline' feature) and `-a' (assume ANSI C-style function
  629. prototypes), alter the content of both the generated `hash' and
  630. `in_word_set' routines.  However, function `in_word_set' may
  631. be modified more extensively, in response to your option settings.  The
  632. options that affect the `in_word_set' structure are:
  633.  
  634.      `-p'
  635.           Have function `in_word_set' return a pointer rather than a boolean.
  636.  
  637.      `-t'
  638.           Make use of the user-defined `struct'.
  639.  
  640.      `-S TOTAL SWITCH STATEMENTS'
  641.           Generate 1 or more C `switch' statement rather than use a large,
  642.           (and potentially sparse) static array.  Although the exact time and
  643.           space savings of this approach vary according to your C compiler's
  644.           degree of optimization, this method often results in smaller and faster
  645.           code.
  646.  
  647. If the `-t', `-S', and `-p' options are omitted the
  648. default action is to generate a `char *' array containing the keys,
  649. together with additional null strings used for padding the array.  By
  650. experimenting with the various input and output options, and timing the
  651. resulting C code, you can determine the best option choices for
  652. different keyword set characteristics.
  653.  
  654. File: gperf-info  Node: Options, Prev: Description, Up: Top, Next: Bugs
  655.  
  656. Options to the `gperf' Utility
  657. ******************************
  658.  
  659. There are *many* options to `gperf'.  They were added to make
  660. the program more convenient for use with real applications.  "On-line"
  661. help is readily available via the `-h' option.  Other options
  662. include:
  663.  
  664.      `-a'
  665.           Generate ANSI Standard C code using function prototypes.  The default is
  666.           to use "classic" K&R C function declaration syntax.
  667.  
  668.      `-c'
  669.           Generates C code that uses the `strncmp' function to perform
  670.           string comparisons.  The default action is to use `strcmp'.
  671.  
  672.      `-C'
  673.           Makes the contents of all generated lookup tables constant, *i.e.*,
  674.           "readonly."  Many compilers can generate more efficient code for this
  675.           by putting the tables in readonly memory.
  676.  
  677.      `-d'
  678.           Enables the debugging option.  This produces verbose diagnostics to
  679.           "standard error" when `gperf' is executing.  It is useful both for
  680.           maintaining the program and for determining whether a given set of
  681.           options is actually speeding up the search for a solution.  Some useful
  682.           information is dumped at the end of the program when the `-d'
  683.           option is enabled.
  684.  
  685.      `-D'
  686.           Handle keywords whose key position sets hash to duplicate values.
  687.           Duplicate hash values occur for two reasons:
  688.  
  689.              * Since `gperf' does not backtrack it is possible for it to process
  690.                all your input keywords without finding a unique mapping for each word.
  691.                However, frequently only a very small number of duplicates occur, and 
  692.                the majority of keys still require one probe into the table.
  693.              * Sometimes a set of keys may have the same names, but possess different
  694.                attributes.  With the -D option `gperf' treats all these keys as part of
  695.                an equivalence class and generates a perfect hash function with multiple
  696.                comparisons for duplicate keys.  It is up to you to completely
  697.                disambiguate the keywords by modifying the generated C code.  However,
  698.                `gperf' helps you out by organizing the output.
  699.  
  700.           Option `-D' is extremely useful for certain large or highly
  701.           redundant keyword sets, *i.e.*, assembler instruction opcodes.
  702.           Using this option usually means that the generated hash function is no
  703.           longer perfect.  On the other hand, it permits `gperf' to work on
  704.           keyword sets that it otherwise could not handle.
  705.  
  706.      `-e KEYWORD DELIMITER LIST'
  707.           Allows the user to provide a string containing delimiters used to
  708.           separate keywords from their attributes.  The default is ",\n".  This
  709.           option is essential if you want to use keywords that have embedded
  710.           commas or newlines.  One useful trick is to use -e'TAB', where TAB is
  711.           the literal tab character.
  712.  
  713.      `-E'
  714.           Define constant values using an enum local to the lookup function rather
  715.           than with #defines.  This also means that different lookup functions can
  716.           reside in the same file.  Thanks to James Clark (jjc at ai.mit.edu).
  717.  
  718.      `-f ITERATION AMOUNT'
  719.           Generate the perfect hash function "fast."  This decreases `gperf''s
  720.           running time at the cost of minimizing generated table-size.  The
  721.           iteration amount represents the number of times to iterate when
  722.           resolving a collision.  `0' means `iterate by the number of keywords.
  723.           This option is probably most useful when used in conjunction with options
  724.           `-D' and/or `-S' for *large* keyword sets.
  725.  
  726.      `-g'
  727.           Assume a GNU compiler, *e.g.*, `g++' or `gcc'.  This
  728.           makes all generated routines use the "inline" keyword to remove the
  729.           cost of function calls.  Note that `-g' does *not* imply
  730.           `-a', since other non-ANSI C compilers may have provisions for a
  731.           function `inline' feature.
  732.  
  733.      `-G'
  734.           Generate the static table of keywords as a static global variable,
  735.           rather than hiding it inside of the lookup function (which is the
  736.           default behavior).
  737.  
  738.      `-h'
  739.           Prints a short summary on the meaning of each program option.  Aborts
  740.           further program execution.
  741.  
  742.      `-H HASH FUNCTION NAME'
  743.           Allows you to specify the name for the generated hash function.  Default
  744.           name is `hash.'  This option permits the use of two hash tables in the
  745.           same file.
  746.  
  747.      `-i INITIAL VALUE'
  748.           Provides an initial VALUE for the associate values array.  Default
  749.           is 0.  Increasing the initial value helps inflate the final table size,
  750.           possibly leading to more time efficient keyword lookups.  Note that this
  751.           option is not particularly useful when `-S' is used.  Also,
  752.           `-i' is overriden when the `-r' option is used.
  753.  
  754.      `-j JUMP VALUE'
  755.           Affects the "jump value," *i.e.*, how far to advance the
  756.           associated character value upon collisions.  JUMP VALUE is rounded
  757.           up to an odd number, the default is 5.  If the JUMP VALUE is 0 `gper
  758.           f'
  759.           jumps by random amounts.
  760.  
  761.      `-k KEYS'
  762.           Allows selection of the character key positions used in the keywords'
  763.           hash function. The allowable choices range between 1-126, inclusive.
  764.           The positions are separated by commas, *e.g.*, `-k 9,4,13,14';
  765.           ranges may be used, *e.g.*, `-k 2-7'; and positions may occur
  766.           in any order.  Furthermore, the meta-character '*' causes the generated
  767.           hash function to consider *all* character positions in each key,
  768.           whereas '$' instructs the hash function to use the "final character"
  769.           of a key (this is the only way to use a character position greater than
  770.           126, incidentally).
  771.  
  772.           For instance, the option `-k 1,2,4,6-10,'$'' generates a hash
  773.           function that considers positions 1,2,4,6,7,8,9,10, plus the last
  774.           character in each key (which may differ for each key, obviously).  Keys
  775.           with length less than the indicated key positions work properly, since
  776.           selected key positions exceeding the key length are simply not
  777.           referenced in the hash function.
  778.  
  779.      `-K KEY NAME'
  780.           By default, the program assumes the structure component identifier for
  781.           the keyword is "name."  This option allows an arbitrary choice of
  782.           identifier for this component, although it still must occur as the first
  783.           field in your supplied `struct'.
  784.  
  785.      `-l'
  786.           Compare key lengths before trying a string comparison.  This might cut
  787.           down on the number of string comparisons made during the lookup, since
  788.           keys with different lengths are never compared via `strcmp'.
  789.           However, using `-l' might greatly increase the size of the
  790.           generated C code if the lookup table range is large (which implies that
  791.           the switch option `-S' is not enabled), since the length table
  792.           contains as many elements as there are entries in the lookup table.
  793.  
  794.      `-L GENERATED LANGUAGE NAME'
  795.           Instructs `gperf' to generate code in the language specified by the
  796.           option's argument.  Languages handled are currently C++ and C.  The
  797.           default is C.
  798.  
  799.      `-n'
  800.           Instructs the generator not to include the length of a keyword when
  801.           computing its hash value.  This may save a few assembly instructions in
  802.           the generated lookup table.
  803.  
  804.      `-N LOOKUP FUNCTION NAME'
  805.           Allows you to specify the name for the generated lookup function.
  806.           Default name is `in_word_set.'  This option permits completely automatic
  807.           generation of perfect hash functions, especially when multiple generated
  808.           hash functions are used in the same application.
  809.  
  810.           Note that if -LC++ is enabled this option provides the name of the
  811.           generated C++ class (since the name of the generated lookup member
  812.           function is then `operator ()').
  813.  
  814.      `-o'
  815.           Reorders the keywords by sorting the keywords so that frequently
  816.           occuring key position set components appear first.  A second reordering
  817.           pass follows so that keys with "already determined values" are placed
  818.           towards the front of the keylist.  This may decrease the time required
  819.           to generate a perfect hash function for many keyword sets, and also
  820.           produce more minimal perfect hash functions.  The reason for this is
  821.           that the reordering helps prune the search time by handling inevitable
  822.           collisions early in the search process.  On the other hand, if the
  823.           number of keywords is *very* large using `-o' may
  824.           *increase* `gperf''s execution time, since collisions will begin
  825.           earlier and continue throughout the remainder of keyword processing.
  826.           See Cichelli's paper from the January 1980 Communications of the ACM for
  827.           details.
  828.  
  829.      `-p'
  830.           Changes the return value of the generated function `in_word_set'
  831.           from boolean (*i.e.*, 0 or 1), to either type "pointer to
  832.           user-defined struct," (if the `-t' option is enabled), or simply
  833.           to `char *', if `-t' is not enabled.  This option is most
  834.           useful when the `-t' option (allowing user-defined structs) is
  835.           used.  For example, it is possible to automatically generate the GNU C
  836.           reserved word lookup routine with the options `-p' and `-t'.
  837.  
  838.      `-r'
  839.           Utilizes randomness to initialize the associated values table.  This
  840.           frequently generates solutions faster than using deterministic
  841.           initialization (which starts all associated values at 0).  Furthermore,
  842.           using the randomization option generally increases the size of the
  843.           table.  If `gperf' has difficultly with a certain keyword set try using
  844.           `-r' or `-D'.
  845.  
  846.      `-s SIZE-MULTIPLE'
  847.           Affects the size of the generated hash table.  The numeric argument for
  848.           this option indicates "how many times larger or smaller" the maximum
  849.           associated value range should be, in relationship to the number of keys.
  850.           If the SIZE-MULTIPLE is negative the maximum associated value is
  851.           calculated by *dividing* it into the total number of keys.  For
  852.           example, a value of 3 means "allow the maximum associated value to be
  853.           about 3 times larger than the number of input keys."  
  854.  
  855.           Conversely, a value of -3 means "allow the maximum associated value to
  856.           be about 3 times smaller than the number of input keys."  Negative
  857.           values are useful for limiting the overall size of the generated hash
  858.           table, though this usually increases the number of duplicate hash
  859.           values.
  860.  
  861.           If `generate switch' option `-S' is *not* enabled, the maximum
  862.           associated value influences the static array table size, and a larger
  863.           table should decrease the time required for an unsuccessful search, at
  864.           the expense of extra table space.
  865.  
  866.           The default value is 1, thus the default maximum associated value about
  867.           the same size as the number of keys (for efficiency, the maximum
  868.           associated value is always rounded up to a power of 2).  The actual
  869.           table size may vary somewhat, since this technique is essentially a
  870.           heuristic.  In particular, setting this value too high slows down
  871.           `gperf''s runtime, since it must search through a much larger range
  872.           of values.  Judicious use of the `-f' option helps alleviate this
  873.           overhead, however.
  874.  
  875.      `-S TOTAL SWITCH STATEMENTS'
  876.           Causes the generated C code to use a `switch' statement scheme,
  877.           rather than an array lookup table.  This can lead to a reduction in both
  878.           time and space requirements for some keyfiles.  The argument to this
  879.           option determines how many `switch' statements are generated. A
  880.           value of 1 generates 1 `switch' containing all the elements, a
  881.           value of 2 generates 2 tables with 1/2 the elements in each
  882.           `switch', etc.  This is useful since many C compilers cannot
  883.           correctly generate code for large `switch' statements. This option
  884.           was inspired in part by Keith Bostic's original C program.
  885.  
  886.      `-t'
  887.           Allows you to include a `struct' type declaration for generated
  888.           code.  Any text before a pair of consecutive %% is consider part of the
  889.           type declaration.  Key words and additional fields may follow this, one
  890.           group of fields per line.  A set of examples for generating perfect hash
  891.           tables and functions for Ada, C, and G++, Pascal, and Modula 2 and 3
  892.           reserved words are distributed with this release.
  893.  
  894.      `-T'
  895.           Prevents the transfer of the type declaration to the output file.  Use
  896.           this option if the type is already defined elsewhere.
  897.  
  898.      `-v'
  899.           Prints out the current version number.
  900.  
  901.      `-Z CLASS NAME'
  902.           Allow user to specify name of generated C++ class.  Default name is
  903.           `Perfect_Hash'.
  904.  
  905. File: gperf-info  Node: Bugs, Prev: Options, Up: Top, Next: Projects
  906.  
  907. Known Bugs and Limitations with `gperf'
  908. ***************************************
  909.  
  910. The following are some limitations with the current release of
  911. `gperf':
  912.  
  913.    * The `gperf' utility is tuned to execute quickly, and works quickly
  914.      for small to medium size data sets (around 1000 keywords).  It is
  915.      extremely useful for maintaining perfect hash functions for compiler
  916.      keyword sets.  Several recent enhancements now enable `gperf' to
  917.      work efficiently on much larger keyword sets (over 15,000 keywords).
  918.      When processing large keyword sets it helps greatly to have over 8 megs
  919.      of RAM.
  920.  
  921.      However, since `gperf' does not backtrack no guaranteed solution
  922.      occurs on every run.  On the other hand, it is usually easy to obtain a
  923.      solution by varying the option parameters.  In particular, try the
  924.      `-r' option, and also try changing the default arguments to the
  925.      `-s' and `-j' options.  To *guarantee* a solution, use
  926.      the `-D' and `-S' options, although the final results are not
  927.      likely to be a *perfect* hash function anymore!  Finally, use the
  928.      `-f' option if you want `gperf' to generate the perfect hash
  929.      function *fast*, with less emphasis on making it minimal.
  930.  
  931.    * The size of the generate static keyword array can get *extremely*
  932.      large if the input keyword file is large or if the keywords are quite
  933.      similar.  This tends to slow down the compilation of the generated C
  934.      code, and *greatly* inflates the object code size.  If this
  935.      situation occurs, consider using the `-S' option to reduce data
  936.      size, potentially increasing keyword recognition time a negligible
  937.      amount.  Since many C compilers cannot correctly generated code for
  938.      large switch statements it is important to qualify the -S option
  939.      with an appropriate numerical argument that controls the number of
  940.      switch statements generated.
  941.  
  942.    * The maximum number of key positions selected for a given key has an
  943.      arbitrary limit of 126.  This restriction should be removed, and if
  944.      anyone considers this a problem write me and let me know so I can remove
  945.      the constraint.
  946.  
  947.    * The C++ source code only compiles correctly with GNU G++, version 1.36
  948.      (and hopefully later versions).  Porting to AT&T cfront would be
  949.      tedious, but possible (and desirable).  There is also a K&R C version
  950.      available now.  This should compile without change on most BSD systems,
  951.      but may require a bit of work to run on SYSV, since `gperf' uses
  952.      ALLOCA in several places.  Send mail to schmidt at ics.uci.edu for
  953.      information.
  954.  
  955. File: gperf-info  Node: Projects, Prev: Bugs, Up: Top, Next: Implementation
  956.  
  957. Things Still Left to Do
  958. ***********************
  959.  
  960. It should be "relatively" easy to replace the current perfect hash
  961. function algorithm with a more exhaustive approach; the perfect hash
  962. module is essential independent from other program modules.  Additional
  963. worthwhile improvements include:
  964.  
  965.    * Make the algorithm more robust.  At present, the program halts with an
  966.      error diagnostic if it can't find a direct solution and the `-D'
  967.      option is not enabled.  A more comprehensive, albeit computationally
  968.      expensive, approach would employ backtracking or enable alternative
  969.      options and retry.  It's not clear how helpful this would be, in
  970.      general, since most search sets are rather small in practice.
  971.  
  972.    * Another useful extension involves modifying the program to generate
  973.      "minimal" perfect hash functions (under certain circumstances, the
  974.      current version can be rather extravagant in the generated table size).
  975.      Again, this is mostly of theoretical interest, since a sparse table
  976.      often produces faster lookups, and use of the `-S' `switch'
  977.      option can minimize the data size, at the expense of slightly longer
  978.      lookups (note that the gcc compiler generally produces good code for
  979.      `switch' statements, reducing the need for more complex schemes).
  980.  
  981.    * In addition to improving the algorithm, it would also be useful to
  982.      generate a C++ class or Ada package as the code output, in addition to
  983.      the current C routines.
  984.  
  985. File: gperf-info  Node: Implementation, Prev: Projects, Up: Top, Next: Bibliography
  986.  
  987. Implementation Details of GNU `gperf'
  988. *************************************
  989.  
  990. A paper describing the high-level description of the data structures and
  991. algorithms used to implement `gperf' will soon be available.  This
  992. paper is useful not only from a maintenance and enhancement perspective,
  993. but also because they demonstrate several clever and useful programming
  994. techniques, *e.g.*, `Iteration Number' boolean arrays, double
  995. hashing, a "safe" and efficient method for reading arbitrarily long
  996. input from a file, and a provably optimal algorithm for simultaneously
  997. determining both the minimum and maximum elements in a list.
  998.  
  999.  
  1000. File: gperf-info  Node: Bibliography, Prev: Implementation, Up: Top
  1001.  
  1002. Bibliography
  1003. ************
  1004.  
  1005. [1] Chang, C.C.: A Scheme for Constructing Ordered Minimal Perfect
  1006. Hashing Functions Information Sciences 39(1986), 187-195.
  1007.        
  1008. [2] Cichelli, Richard J. Author's Response to "On Cichelli's Minimal Perfec
  1009. t Hash
  1010. Functions Method" Communications of the ACM, 23, 12(December 1980), 729.
  1011.     
  1012. [3] Cichelli, Richard J. Minimal Perfect Hash Functions Made Simple
  1013. Communications of the ACM, 23, 1(January 1980), 17-19.
  1014.            
  1015. [4] Cook, C. R. and Oldehoeft, R.R. A Letter Oriented Minimal
  1016. Perfect Hashing Function SIGPLAN Notices, 17, 9(September 1982), 18-27.
  1017.  
  1018. [5] Cormack, G. V. and Horspool, R. N. S. and Kaiserwerth, M.
  1019. Practical Perfect Hashing Computer Journal, 28, 1(January 1985), 54-58.
  1020.     
  1021. [6] Jaeschke, G. Reciprocal Hashing: A Method for Generating Minimal
  1022. Perfect Hashing Functions Communications of the ACM, 24, 12(December
  1023. 1981), 829-833.
  1024.  
  1025. [7] Jaeschke, G. and Osterburg, G. On Cichelli's Minimal Perfect
  1026. Hash Functions Method Communications of the ACM, 23, 12(December 1980),
  1027. 728-729.
  1028.  
  1029. [8] Sager, Thomas J. A Polynomial Time Generator for Minimal Perfect
  1030. Hash Functions Communications of the ACM, 28, 5(December 1985), 523-532
  1031.  
  1032. [9] Schmidt, Douglas C. GPERF: A Perfect Hash Function Generator
  1033. Second USENIX C++ Conference Proceedings, April 1990.
  1034.  
  1035. [10] Sebesta, R.W. and Taylor, M.A. Minimal Perfect Hash Functions
  1036. for Reserved Word Lists  SIGPLAN Notices, 20, 12(September 1985), 47-53.
  1037.  
  1038. [11] Sprugnoli, R. Perfect Hashing Functions: A Single Probe
  1039. Retrieving Method for Static Sets Communications of the ACM, 20
  1040. 11(November 1977), 841-850.
  1041.  
  1042. [12] Stallman, Richard M. Using and Porting GNU CC Free Software Foundation,
  1043. 1988.
  1044.  
  1045. [13] Stroustrup, Bjarne The C++ Programming Language. Addison-Wesley, 1986.
  1046.  
  1047. [14] Tiemann, Michael D. User's Guide to GNU C++ Free Software
  1048. Foundation, 1989.
  1049.  
  1050. Tag table:
  1051. Node: Top1109
  1052. Node: Copying1934
  1053. Node: Contributors15128
  1054. Node: Motivation16214
  1055. Node: Search Structures17470
  1056. Node: Description21006
  1057. Node: Input Format22805
  1058. Node: Declarations23593
  1059. Node: Keywords25881
  1060. Node: Functions27459
  1061. Node: Output Format27968
  1062. Node: Options30412
  1063. Node: Bugs43777
  1064. Node: Projects46452
  1065. Node: Implementation48011
  1066. Node: Bibliography48724
  1067. End tag table
  1068.